#include <iostream>
#include <cerrno>
#include <cstring>
#include <unistd.h>
#include <pthread.h>
#include <thread>
#include <vector>
#include  "Thread.hpp"
using namespace ThreadModel;


int g_ticket = 10000;

void buyticket(int& ticket)
{
    std::cout << "&ticket : " << &ticket << std::endl;
    // while(true)
    // {
    //     if(ticket > 0)
    //     {
    //         usleep(1000);
    //         printf("ticket : %d\n", ticket);
    //         ticket--;
    //     }
    //     else break;
    // }
    while(ticket > 0)
    {
        usleep(1000);
        printf("ticket : %d\n", ticket);
        ticket--;
    }
}

int main()
{
    std::cout << "main &ticket : " << &g_ticket << std::endl;
    std::vector<Thread<int>> threads;
    for (int i = 0; i < 4; i++)
    {
        std::string name = "thread-" + std::to_string(i + 1);
        threads.emplace_back(buyticket, g_ticket, name);
    }

    for (auto thread : threads)
        thread.Start();
    sleep(10);

    for (auto thread : threads)
        thread.Join();
    return 0;
}





// void threadrun(int argc)
// {
//     while(true)
//     {
//         std::cout << "I am a thread" << std::endl;
//         sleep(1);
//     }
// }

// const int NUM = 5;
// int main()
// {
//     std::vector<Thread<int>> threads;
//     for (int i = 0; i < NUM; i++)
//     {
//         std::string name = "thread-" + std::to_string(i + 1);
//         threads.emplace_back(threadrun, i, name);
//     }
//     //启动线程
//     for (auto thread : threads)
//     {
//         thread.Start();
//     }
//     sleep(10);
//     //等待线程
//     for (auto thread : threads)
//     {
//         thread.Join();
//         std::cout << thread.name() << " wait done..." << std::endl;
//     }
    
//     return 0;
// }


// void run(int)
// {
//     while(true)
//     {
//         std::cout << "I am a thread" << std::endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     int t = 10;
//     Thread<int> t1(run, t, "thread-1");
//     t1.Start();
//     t1.Join();
//     std:: cout << "main thread wait done" << std::endl;
//     return 0;
// }

// void threadrun(int, int, int)
// {
//     while(true)
//     {
//         std::cout << "thread running ...." << std::endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     std::thread t1(threadrun, 1, 2, 3);

//     t1.join();
//     return 0;
// }



// void *threadrun(void *args)
// {
//     //pthread_detach(pthread_self());
//     int cnt = 5;
//     while (cnt--)
//     {
//         std::cout << "I am new thread" << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadrun, nullptr);
//     pthread_detach(tid);
//     // while (true)
//     // {
//     //     std::cout << "I am main thread" << std::endl;
//     //     sleep(1);
//     // }
//     //main thread阻塞等待线程
//     // std::cout << "main thread wait blocked" << std::endl;
//     // int n = pthread_join(tid, nullptr);
//     // std::cout <<  "main thread wait done, n : " << n << ", errstr : " << strerror(errno) << std::endl;
//     return 0;
// }